package com.castle.fortress.admin.utils;

import cn.hutool.core.util.StrUtil;

/**
 * 数据脱敏工具类
 * 注：该类中的所有方法必须是静态方法并且只能有一个String类型参数，否则无法在切面使用
 */
public class DmUtil {
    /**
     * 保留首字符，其余数据用*号替换，最多显示3个星号
     * @param s
     * @return
     */
    public static String type1(String s){
        if(StrUtil.isEmpty(s)){
            return s;
        }
        StringBuilder targetReg = new StringBuilder("$1");
        //超过4个字符时，最多显示3个星号
        if(s.length()>=4){
            targetReg.append("***");
        //小于4个字符时，显示真实长度的星号
        }else{
            for(int i=1;i<s.length();i++){
                targetReg.append("*");
            }
        }
        s=s.replaceAll("(.{1})(.*)",targetReg.toString());
        return s;
    }

    /**
     * 保留首尾字符，其余数据用*号替换，最多显示3个星号
     * @param s
     * @return
     */
    public static String type2(String s){
        if(StrUtil.isEmpty(s)){
            return s;
        }
        StringBuilder targetReg = new StringBuilder("$1");
        //超过4个字符时，最多显示3个星号
        if(s.length()>=5){
            targetReg.append("***");
            //小于4个字符时，显示真实长度的星号
        }else{
            for(int i=1;i<s.length()-1;i++){
                targetReg.append("*");
            }
        }
        targetReg.append("$3");
        s=s.replaceAll("(.{1})(.*)(.{1})",targetReg.toString());
        return s;
    }

    /**
     * 手机号保留前3位和后3位，其余用3个星号替换
     * @param s
     * @return
     */
    public static String phone(String s){
        if(StrUtil.isEmpty(s)){
            return s;
        }
        s=s.replaceAll("(.{3})(.*)(.{3})","$1***$3");
        return s;
    }

    /**
     * 保留前4位，其余用3个星号替换
     * @param s
     * @return
     */
    public static String IDENTITY(String s){
        if(StrUtil.isEmpty(s)){
            return s;
        }
        s=s.replaceAll("(.{4})(.*)","$1***");
        return s;
    }

    /**
     * 两字姓名保留首字符，三字及以上保留首尾字符
     * @param s
     * @return
     */
    public static String NAME(String s){
        if(StrUtil.isEmpty(s)){
            return s;
        }
        if(s.length()==2){
            s=s.replaceAll("(.{1})(.*)","$1*");
        }else if(s.length()>2){
            s = type2(s);
        }
        return s;
    }

}
